package com.miku.manager;

import com.miku.common.ErrorCode;
import com.miku.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 专门提供RedisLimiter服务的基础服务的(提供了通用的服务的)
 */
@Service
@Slf4j
public class RedisLimterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流
     * 每秒颁发两个令牌
     * @param key
     */
    public void doRateLimit(String key){
        //创建一个限流器
        RRateLimiter limiter = redissonClient.getRateLimiter(key);
        limiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
        //每当一个操作来了后,请求n个令牌
        boolean result = limiter.tryAcquire(1);
        if (!result){
            log.error("{},限流了,请勿频繁请求",key);
            throw new BusinessException(ErrorCode.TO_MANY_REQUESTS_ERROR,"请勿频繁请求");
        }

    }
}
